The counts tables are deposited on the Gene Expression Omnibus database (GEO), accession number GSE159390.
counts <- read.csv('../data/geo_submission/counts_raw.csv', sep = ',', header = T,row.names = 1)
coldata <- read.csv('../data/geo_submission/cell_metadata_raw.csv', row.names = 1)
# identify spike-in genes
ercc_rows <- grepl('^ERCC', rownames(counts))
ercc_counts <- counts[ercc_rows,]
# remove spike-in genes from counts
counts <- counts[!ercc_rows,]cell filtering
Plate P4rep exhibits a large number of poor-quality cells, known to invalidate the outlier-detection approach for cell-filtering. To obviate, QC metrics are shared across plates to select high-quality cells.
mito <- grep('^mt.*', rowData(sce)[,'SYMBOL'])
stats <- perCellQCMetrics(sce, subsets=list(Mt=mito))
# share QC metrics across good plates
discard_libsize <- isOutlier(stats$sum, type = 'lower', log = T,
batch = sce$plate, subset = sce$plate %in% c('2','7'))
discard_features <- isOutlier(stats$detected, type = 'lower', log = T,
batch = sce$plate, subset = sce$plate %in% c('2','7'))
discard_mito <- isOutlier(stats$subsets_Mt_percent, type = 'higher', log = F,
batch = sce$plate, subset = sce$plate %in% c('2','7'))
discard_ercc <- isOutlier(stats$altexps_spike_in_percent, type = 'higher', log = F,
batch = sce$plate, subset = sce$plate %in% c('2','7'))
discard_df <- data.frame(libsize = discard_libsize, features = discard_features,
mitoc = discard_mito, ercc = discard_ercc, plate = sce$plate)
# discard cells with low library size / few detected genes / high ercc counts
discard_df$discard <- sign(rowSums(discard_df[,c(1,2,4)]))
colSums(discard_df[,c('libsize','features','mitoc','ercc','discard')])## libsize features mitoc ercc discard
## 182 228 109 253 322
colData(sce)[,colnames(stats)] <- stats
sce$discard <- as.logical(discard_df$discard)
qc_plot <- wrap_plots(
plotColData(sce, x="plate", y="sum", colour_by="discard", point_size =.25,
show_median =T) +
scale_y_log10() + labs(y = 'library size'),
plotColData(sce, x="plate", y="detected", colour_by="discard", point_size =.25,
show_median =T) + scale_y_log10() + labs(y = 'detected genes'),
plotColData(sce, x="plate", y="subsets_Mt_percent", colour_by="discard",
point_size =.25, show_median =T) + labs(y = 'mitochondrial_pct'),
plotColData(sce, x="plate", y="altexps_spike_in_percent", colour_by="discard",
point_size =.25, show_median =T) + ggtitle("spike_in percent"))
qc_plot <- qc_plot + plot_layout(guides = 'collect') & theme_bw(base_size = 7)
print(qc_plot)# discard low-quality cells
sce <- sce[,!sce$discard]Normalization via deconvolution Pool-based normalization is the recommended normalization method to remove bias associated with RNA content [Lun, A. et al., 2017]. Here, a version optimized for handling batch effects is used:
sce <- computeSumFactors(sce)
sce <- multiBatchNorm(sce, batch = sce$plate)Feature selection The mean-variance relationship is modelled separately for each plate, and significant genes are retained:
# use spike-in to model gene-variance relationship
genevar <- modelGeneVarWithSpikes(sce, "spike_in", block=sce$plate)
chosen.hvgs <- getTopHVGs(genevar, fdr.threshold = 0.05)
# remove cell-cycle genes
cc.genes <- AnnotationDbi::select(org.Mm.eg.db, keys="GO:0007049", keytype="GOALL", column="ENSEMBL")$ENSEMBL
chosen.hvgs <- chosen.hvgs[!rowData(sce)[chosen.hvgs, 'ENSEMBL'] %in% cc.genes]genevar_plots = lapply(1:length(unique(sce$plate)), function(i){
genevar_genes = genevar$per.block[[i]] %>% as.data.frame()
genevar_spikeins = data.frame(mean = metadata(genevar$per.block[[i]])$mean,
var = metadata(genevar$per.block[[i]])$var)
genevar_genes$trend = metadata(genevar$per.block[[i]])$trend(genevar_genes$mean)
ggplot(genevar_genes, aes(x = mean, y = total)) + geom_point(size = 0.25*pointsize, col = 'grey60') +
geom_point(inherit.aes = F, data = genevar_spikeins, aes(x = mean, y = var),size = pointsize, col = 'red') +
geom_line(inherit.aes = F, data = genevar_genes, aes(x = mean, y = trend), col = 'blue') +
theme_bw() + labs(title = unique(sce$plate)[i]) + xlim(c(0,12)) + ylim(c(0,17.5))
})
wrap_plots(genevar_plots)batch correction Plate-effects can be corrected by using a linear method from the limma package:
assay(sce, "corrected") <- removeBatchEffect(logcounts(sce), batch = sce$plate)sce <- runPCA(sce, exprs_values = "corrected", subset_row = chosen.hvgs)
pc_var = data.frame(var_pct = attr(reducedDim(sce),'percentVar'))
ggplot(data.frame(var_pct = attr(reducedDim(sce),'percentVar')), aes(x = order(var_pct, decreasing = T), y = var_pct)) +
geom_point()+ geom_line() + theme_bw() + geom_vline(xintercept = 10, col = 'red') Analysis of explained variance per PC shows that most information is contained in the first few components. We will retain 10 for downstream analyses.
PHATE has been popularized as an effective dimensionality reduction method to visualize differentiation trajectories:
reducedDim(sce, 'PHATE2D') <- phateR::phate(reducedDim(sce,'PCA')[,1:10], ndim =2, verbose =0)$embedding
coldata_dr(sce,color.column = 'cell_type2', dimred = 'PHATE2D',size = pointsize) +
scale_color_tableau(palette = 'Tableau 10') + labs( title = 'cell type') This visualization broadly confirms proximity relationships across hematopoietic compartments.
Additional annotation is generated by:
Computing pseudotime coordinates using diffusion pseudotime via the destiny package.
Running Seurat’s AddModuleScore function to aggregate the expression of known lineage markers and score their expression on each cell:
# compute diffusion map (necessary for diffusion pseudotime)
dmap = destiny::DiffusionMap(reducedDim(sce,'PCA')[,1:10])
reducedDim(sce, 'DiffusionMap') <- dmap@eigenvectors
# isolate stem cell tip on PHATE coordinates
stem_tip = as.integer(which.min(as.logical(sce$cell_type2 == 'HSC') * reducedDim(sce,'PHATE2D')[,1]))
sce$stem_tip = FALSE
sce$stem_tip[stem_tip] = TRUE
dpt =destiny::DPT(dmap, tips = stem_tip)
# assign pseudotime coordinate
sce$dpt = dpt$DPT489 # this is the value of stem_tip
sce$dpt_rank = rank(sce$dpt)
lineage_sets <- openxlsx::read.xlsx('../docs/camargo_sets.xlsx')
# load SingleCellExperiment object in Seurat
seu <- CreateSeuratObject(counts = counts(sce))
seu@assays$RNA@data = assay(sce, 'corrected')
selection = c('preMeg','preEry','preGM','preB')
# compute scores for selected sets
for(i in selection){
feature_names = rownames(seu)[rowData(sce)[, 'SYMBOL'] %in% lineage_sets[[i]]]
seu <- AddModuleScore(seu, features = list(feature_names), name = i)}
# transfer scores in SingleCellExperiment object
colData(sce)[,selection] <- seu@meta.data[,paste0(selection,'1')]
# plotting
p_dpt <- coldata_dr(sce, color.column = 'dpt_rank', dimred = 'PHATE2D',size = pointsize) +
scale_color_viridis_c() + guides(col = F) + labs( title ='pseudotie rank')
p_my <- coldata_dr(sce, color.column = 'preGM', dimred = 'PHATE2D',size = pointsize) +
scale_color_viridis_c() + guides(col = F) + labs( title ='myeloid score')
p_mk <- coldata_dr(sce, color.column = 'preMeg', dimred = 'PHATE2D',size = pointsize) +
scale_color_viridis_c() + guides(col = F) + labs( title ='mk score')
p_ery <- coldata_dr(sce, color.column = 'preEry', dimred = 'PHATE2D',size = pointsize) +
scale_color_viridis_c() + guides(col = F) + labs( title ='ery score')
fig <- (p_dpt + p_mk + p_my + p_ery) + plot_layout(guides = 'collect') &
theme(axis.title = element_blank(),
axis.text = element_blank())
figNext, we’ll investigate proximity relations between HSCs and MkP subsets.
Distance between CD48 subsets of MkP and HSCs:
mkp_cols <- sce$cell_type2 == 'MkP'
hsc_cols <- sce$cell_type2 == 'HSC'
distance <- as.matrix(dist(reducedDim(sce)[,1:10]))
distance <- distance[mkp_cols, hsc_cols] %>% rowMedians()
df <- data.frame(subset = sce$CD48_binary[mkp_cols], distance = distance)
distance_boxplot_MkP <- ggboxplot(data = df, x = 'subset', y = 'distance', add = 'jitter', color = 'subset', palette = viridis(2)) +
stat_compare_means(comparisons = list(c('low','high')),
method = 'wilcox.test',label = "p.signif") + xlab('MkP CD 48 subset') + ylab('proximity to HSC') + scale_y_reverse() +
guides(col =F)
distance_boxplot_MkPDistance between Sca-1 subsets of HSCs and CD48-/lo MkPs:
mkp_cols <- sce$cell_type2 == 'MkP' & sce$CD48_binary == 'low'
hsc_cols <- sce$cell_type2 == 'HSC'
distance <- as.matrix(dist(reducedDim(sce)[,1:10]))
distance <- distance[mkp_cols, hsc_cols] %>% colMedians()
df <- data.frame(subset = sce$Sca_1_binary[hsc_cols], distance = distance, Sca1 = sce$Sca_1_log10[hsc_cols],
CD201 = sce$CD201_log10_normalized[hsc_cols])
distance_boxplot_HSC <- ggboxplot(data = df, x = 'subset', y = 'distance', add = 'jitter', color = 'subset', palette = viridis(2)) +
stat_compare_means(comparisons = list(c('low','high')),
method = 'wilcox.test',label = "p.signif") + xlab('HSC Sca1 subset') + ylab('proximity to MkP (CD 48 low)') + scale_y_reverse() +
guides(col =F)
distance_boxplot_HSCrefine populations
Based on expression of surface markers, we refine the populations. Subsets that we’re interested in are higlighted in the following plot:
Note: Very few cells are observed as Sca1- and CD201+. Here, CD201+ HSCs are grouped for simplicity.
sce$cell_type3<- as.character(sce$cell_type2)
sce$cell_type3[sce$cell_type2 == 'MkP' & sce$CD48_binary == 'low'] = 'MkP_CD48-'
sce$cell_type3[sce$cell_type2 == 'MkP' & sce$CD48_binary == 'high'] = 'MkP_CD48+'
sce$cell_type3[sce$cell_type2 == 'HSC' & sce$Sca_1_binary == 'low'] = 'HSC_Sca1-'
sce$cell_type3[sce$cell_type2 == 'HSC' & sce$Sca_1_binary == 'high'] = 'HSC_Sca1+'
sce$cell_type3[sce$cell_type2 == 'MPP' & sce$Sca_1_binary == 'low'] = 'MPP_Sca1-'
sce$cell_type3[sce$cell_type2 == 'MPP' & sce$Sca_1_binary == 'high'] = 'MPP_Sca1+'
sce$cell_type3[sce$cell_type2 == 'HPC_1' & sce$Sca_1_binary == 'low'] = 'HPC1_Sca1-'
sce$cell_type3[sce$cell_type2 == 'HPC_1' & sce$Sca_1_binary == 'high'] = 'HPC1_Sca1+'
sce$cell_type3[sce$cell_type3 == 'HSC_Sca1+' & sce$CD201_binary == 'high'] = 'HSC_Sca1+__CD201+'
sce$cell_type3[sce$cell_type3 == 'HSC_Sca1+' & sce$CD201_binary == 'low'] = 'HSC_Sca1+__CD201-'
sce$cell_type3[sce$cell_type3 == 'HSC_Sca1-' & sce$CD201_binary == 'high'] = 'HSC_Sca1-__CD201+'
sce$cell_type3[sce$cell_type3 == 'HSC_Sca1-' & sce$CD201_binary == 'low'] = 'HSC_Sca1-__CD201-'
# transcript-based
sce$cell_type3[sce$cell_type2 == 'HPC_1' & sce$preB >2] = 'HPC1_lymphoid'sce$cell_type4<- as.character(sce$cell_type3)
sce$cell_type4[sce$cell_type3 == 'HSC_Sca1-__CD201+'] = 'HSC_CD201+'
sce$cell_type4[sce$cell_type3 == 'HSC_Sca1+__CD201+'] = 'HSC_CD201+'p <- coldata_dr(sce, col = 'cell_type4',dimred = 'PHATE2D', size = pointsize) +
scale_color_manual(values = c(rep('lightgrey',3),"#4E79A7","#F28E2B","#E15759", rep('lightgrey',2),"#00AFBB", "#E7B800",rep('lightgrey',2))) + labs(title = 'hsc subsets')
pProximity analysis for n>2 populations is unwieldy. We will use PAGA to investigate proximity relations systematically:
### assign gene expression values in easily accessible containers:
pca <- reducedDim(sce,'PCA')
logc <- assay(sce,'corrected')
coldata <- as.data.frame(colData(sce))
rowdata <- as.data.frame(rowData(sce))import scanpy as sc
import numpy as np
x = sc.AnnData(X = r.logc.transpose())
x.obsm['X_pca'] = np.array(r.pca)
x.obs = r.coldata
x.var_names = r.rowdata.index
sc.pp.neighbors(x, n_pcs =10)
sc.tl.paga(x, groups='cell_type4')## /Users/greco/opt/anaconda3/lib/python3.7/site-packages/anndata/_core/anndata.py:1192: FutureWarning: is_categorical is deprecated and will be removed in a future version. Use is_categorical_dtype instead
## if is_string_dtype(df[key]) and not is_categorical(df[key])
## ... storing 'plate' as categorical
## ... storing 'mouse' as categorical
## ... storing 'age' as categorical
## ... storing 'sex' as categorical
## ... storing 'cell_type' as categorical
## ... storing 'LR' as categorical
## ... storing 'Row' as categorical
## ... storing 'cell_type2' as categorical
## ... storing 'CD48_binary' as categorical
## ... storing 'Sca_1_binary' as categorical
## ... storing 'CD201_binary' as categorical
## ... storing 'cell_type3' as categorical
## ... storing 'cell_type4' as categorical
sc.pl.paga(x, color=['cell_type4'], threshold =.9, layout = 'fr', edge_width_scale =0.25)The PAGA layout largely confirms the results from the labelling propagation data. To verify that this network is the “best fitting one”, i.e., no alternative models can explain the as well as the one displayed, we can plot the distribution of the confidence placed by the model in each link, and highlight the links that exceed the selected threshold:
connectivies = x.uns['paga']['connectivities']connectivities = as.matrix(py$connectivies)
connectivities = unlist(connectivities[upper.tri(connectivities)])
df = data.frame(confidence = connectivities)
fig_sx2 = ggplot(df, aes(x = confidence)) + geom_histogram(aes(fill = confidence > 0.9),bins = 20) +
scale_fill_tableau() + theme(text = element_text(size =10))
fig_sx2PAGA connectivities seem to infer a differentiaion link from CD48- MkP to CD48+ MkP. By looking more closely at the relationship between pseudotime and Mk score, we observe how differentiation (of which Mk score represents a transcriptional proxy) proceeds indipendently in the two subsets:
# use default dpt
df = colData(sce)[,c('cell_type3','cell_type4','preMeg','dpt', 'CD48_log10')] %>%
as.data.frame() %>%
dplyr::filter(grepl('^MkP', cell_type3), preMeg > 0)
p2 <- ggscatter(df%>% dplyr::filter(grepl('^MkP', cell_type3)), x = 'dpt', y = 'preMeg', color = "cell_type3",
size =pointsize,
add = "reg.line", # Add regressin line
#add.params = list(color = 'cell_type3'),
palette =c("#00AFBB", "#E7B800"),
add.params = list(color = "cell_type3", fill = "lightgray"), # Customize reg. line
conf.int = TRUE, # Add confidence interval
cor.coeff.args = list(label.sep = "\n")) + labs(y = 'mk score', x = 'pseudotime') +
stat_cor(aes(color = cell_type3), size =10/.pt) + guides(col='none')
fig_sx3 = p2 + plot_annotation(caption = 'two cells from myeloid branch with low mk score were excluded')
fig_sx3## `geom_smooth()` using formula 'y ~ x'
df <- as.data.frame(reducedDim(sce, 'PHATE2D')[,c(1,2)])
colnames(df) <- c('dr1','dr2')
df[['CD48_log10']] <- colData(sce)[,'CD48_log10']
df[['Sca1_log10']] <- colData(sce)[,'Sca_1_log10']
p_Sca1 <- ggplot(df, aes(x = dr1, y = dr2)) + geom_point(col = 'grey90', alpha =.8, size =pointsize,stroke =0) +
geom_point(data= df[sce$cell_type2 %in% c('HSC','MPP','HPC_1'),] , aes(x = dr1,y=dr2, col = Sca1_log10), size =pointsize, stroke=0,inherit.aes = F) + scale_color_viridis_c() + guides(col =F) + labs( title ='Sca1')
p_mkpsubs <- coldata_dr(sce, col = 'cell_type3',dimred = 'PHATE2D', size = pointsize) +
scale_color_manual(values = c(rep('lightgrey',9),"#4E79A7","#F28E2B", rep('lightgrey',2))) + labs(title = 'mkp subsets')
fig_3ef <- (p_Sca1 + p_mkpsubs) &
theme(legend.position = 'none',
axis.title = element_blank(),
axis.text = element_blank())
fig_3efmkp_cols <- sce$cell_type2 == 'MkP'
hsc_cols <- sce$cell_type2 == 'HSC'
distance <- as.matrix(dist(reducedDim(sce,'PHATE2D')))
distance <- distance[mkp_cols, hsc_cols] %>% rowMedians()
df <- data.frame(subset = sce$CD48_binary[mkp_cols], distance = distance,
Sca1 = sce$Sca_1_log10[mkp_cols],
CD201 = sce$CD201_log10_normalized[mkp_cols])
distance_boxplot_MkP <- ggboxplot(data = df, x = 'subset', y = 'distance', add = 'jitter',
color = 'subset', add.params = list(size = pointsize), palette = viridis(2)) +
stat_compare_means(comparisons = list(c('low','high')),
method = 'wilcox.test',label = "p.signif") + xlab('MkP CD48 subset') + ylab('proximity to HSC') + scale_y_reverse() + guides(col =F)
distance_boxplot_MkPmkp_cols <- sce$cell_type2 == 'MkP' & sce$CD48_binary == 'low'
hsc_cols <- sce$cell_type2 == 'HSC'
distance <- as.matrix(dist(reducedDim(sce,'PHATE2D')))
distance <- distance[mkp_cols, hsc_cols] %>% colMedians()
df <- data.frame(subset = sce$Sca_1_binary[hsc_cols], distance = distance, Sca1 = sce$Sca_1_log10[hsc_cols],
CD201 = sce$CD201_log10_normalized[hsc_cols])
distance_boxplot_HSC <- ggboxplot(data = df, x = 'subset', y = 'distance', add = 'jitter',
color = 'subset', add.params = list(size = pointsize), palette = viridis(2)) +
stat_compare_means(comparisons = list(c('low','high')),
method = 'wilcox.test',label = "p.signif") + xlab('HSC Sca1 subset') + ylab('proximity to MkP (CD 48 low)') + scale_y_reverse() + guides(col =F)
distance_boxplot_HSCmy_theme <- theme(axis.text = element_blank(),
axis.title = element_blank())
p_vwf <- gene_dr(sce, gene = 'Vwf', dimred = 'PHATE2D', size = pointsize) + guides(col =F) + my_theme
p_cd41 <- gene_dr(sce, gene = 'Itga2b', dimred = 'PHATE2D', size = pointsize) + guides(col =F) + my_theme
# boxplots -------------------------------------------------------
cell_types = c('HSC_CD201+', 'HSC_Sca1+__CD201-', 'HSC_Sca1-__CD201-', 'MkP_CD48-', 'MkP_CD48+','HPC1_Sca1+')
assayname <- 'logcounts'
df <- colData(sce)[sce$cell_type4 %in% cell_types,] %>% as.data.frame() %>%
dplyr::select(cell_type4, plate,CD41_log10 )
df$Vwf <- assay(sce, assayname)['Vwf', sce$cell_type4 %in% cell_types]
df$Cd41 <- assay(sce, assayname)['Itga2b', sce$cell_type4 %in% cell_types]
df$cell_type4 <- factor(df$cell_type4,
levels = c('HSC_CD201+', 'HSC_Sca1+__CD201-', 'HSC_Sca1-__CD201-', 'MkP_CD48-', 'MkP_CD48+','HPC1_Sca1+'))
comparisons <- list(c('HSC_CD201+', 'HSC_Sca1+__CD201-'),
c('HSC_CD201+', 'HSC_Sca1-__CD201-'),
c('HSC_CD201+', 'MkP_CD48-'),
c('HSC_CD201+', 'MkP_CD48+'),
c('HSC_Sca1+__CD201-', 'HSC_Sca1-__CD201-'),
c('HSC_Sca1+__CD201-', 'MkP_CD48-'),
c('HSC_Sca1+__CD201-', 'MkP_CD48+'),
c('HSC_Sca1-__CD201-', 'MkP_CD48-'),
c('HSC_Sca1-__CD201-', 'MkP_CD48+'),
c('MkP_CD48-', 'MkP_CD48+'))
p_vwf.2 <- ggplot(df, aes(x = cell_type4, y = Vwf)) + geom_boxplot(outlier.colour = NA) +
geom_jitter(stroke =0 , alpha =0.5, size = pointsize) + stat_compare_means(comparisons = comparisons, label = 'p.signif', size =7/.pt) +
theme(axis.text.x = element_text(angle = -30, hjust =0, vjust = 0.5)) + theme(axis.text.x = element_blank())
p_cd41.2 <- ggplot(df, aes(x = cell_type4, y = Cd41)) + geom_boxplot(outlier.colour = NA) +
geom_jitter(stroke =0 , alpha =0.5, size = pointsize) + stat_compare_means(comparisons = comparisons, label = 'p.signif', size =7/.pt) +
theme(axis.text.x = element_text(angle = -30, hjust =0, vjust = 0.5))
fig_s7e <- (p_vwf + p_vwf.2 + p_cd41 + p_cd41.2) +
plot_layout(ncol =2, widths = c(0.4,0.8)) & theme(text = element_text(size =7))
fig_s7esessionInfo()## R version 4.0.4 (2021-02-15)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Mojave 10.14.6
##
## Matrix products: default
## BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
##
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## attached base packages:
## [1] parallel stats4 stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] ensembldb_2.14.1 AnnotationFilter_1.14.0 GenomicFeatures_1.42.3
## [4] viridis_0.6.1 viridisLite_0.4.0 patchwork_1.1.1
## [7] ggpubr_0.4.0 ggthemes_4.2.4 forcats_0.5.1
## [10] stringr_1.4.0 dplyr_1.0.7 purrr_0.3.4
## [13] readr_2.0.1 tidyr_1.1.3 tibble_3.1.3
## [16] tidyverse_1.3.1 limma_3.46.0 org.Mm.eg.db_3.12.0
## [19] AnnotationDbi_1.52.0 AnnotationHub_2.22.1 BiocFileCache_1.14.0
## [22] dbplyr_2.1.1 batchelor_1.6.3 SeuratObject_4.0.2
## [25] Seurat_4.0.4 scater_1.18.6 ggplot2_3.3.5
## [28] scran_1.18.7 SingleCellExperiment_1.12.0 SummarizedExperiment_1.20.0
## [31] Biobase_2.50.0 GenomicRanges_1.42.0 GenomeInfoDb_1.26.7
## [34] IRanges_2.24.1 S4Vectors_0.28.1 BiocGenerics_0.36.1
## [37] MatrixGenerics_1.2.1 matrixStats_0.60.1 reticulate_1.20
##
## loaded via a namespace (and not attached):
## [1] rappdirs_0.3.3 rtracklayer_1.50.0 scattermore_0.7
## [4] bit64_4.0.5 knitr_1.33 irlba_2.3.3
## [7] DelayedArray_0.16.3 data.table_1.14.0 rpart_4.1-15
## [10] RCurl_1.98-1.4 generics_0.1.0 cowplot_1.1.1
## [13] RSQLite_2.2.8 RANN_2.6.1 proxy_0.4-26
## [16] future_1.22.1 tzdb_0.1.2 bit_4.0.4
## [19] xml2_1.3.2 spatstat.data_2.1-0 lubridate_1.7.10
## [22] httpuv_1.6.2 assertthat_0.2.1 xfun_0.25
## [25] hms_1.1.0 jquerylib_0.1.4 evaluate_0.14
## [28] promises_1.2.0.1 progress_1.2.2 DEoptimR_1.0-9
## [31] fansi_0.5.0 readxl_1.3.1 igraph_1.2.6
## [34] DBI_1.1.1 htmlwidgets_1.5.3 spatstat.geom_2.2-2
## [37] ellipsis_0.3.2 RSpectra_0.16-0 backports_1.2.1
## [40] biomaRt_2.46.3 deldir_0.2-10 sparseMatrixStats_1.2.1
## [43] vctrs_0.3.8 TTR_0.24.2 ROCR_1.0-11
## [46] abind_1.4-5 cachem_1.0.6 RcppEigen_0.3.3.9.1
## [49] withr_2.4.2 robustbase_0.93-8 vcd_1.4-8
## [52] sctransform_0.3.2 GenomicAlignments_1.26.0 prettyunits_1.1.1
## [55] xts_0.12.1 goftest_1.2-2 cluster_2.1.2
## [58] lazyeval_0.2.2 laeken_0.5.1 crayon_1.4.1
## [61] labeling_0.4.2 edgeR_3.32.1 pkgconfig_2.0.3
## [64] ProtGenerics_1.22.0 nlme_3.1-152 vipor_0.4.5
## [67] nnet_7.3-16 rlang_0.4.11 globals_0.14.0
## [70] lifecycle_1.0.0 miniUI_0.1.1.1 modelr_0.1.8
## [73] rsvd_1.0.5 cellranger_1.1.0 polyclip_1.10-0
## [76] RcppHNSW_0.3.0 lmtest_0.9-38 Matrix_1.3-4
## [79] carData_3.0-4 boot_1.3-28 zoo_1.8-9
## [82] reprex_2.0.1 beeswarm_0.4.0 ggridges_0.5.3
## [85] png_0.1-7 knn.covertree_1.0 bitops_1.0-7
## [88] KernSmooth_2.23-20 Biostrings_2.58.0 blob_1.2.2
## [91] DelayedMatrixStats_1.12.3 parallelly_1.27.0 rstatix_0.7.0
## [94] ggsignif_0.6.2 beachmat_2.6.4 scales_1.1.1
## [97] memoise_2.0.0 magrittr_2.0.1 plyr_1.8.6
## [100] hexbin_1.28.2 ica_1.0-2 zlibbioc_1.36.0
## [103] compiler_4.0.4 dqrng_0.3.0 tinytex_0.33
## [106] RColorBrewer_1.1-2 pcaMethods_1.82.0 fitdistrplus_1.1-5
## [109] Rsamtools_2.6.0 cli_3.0.1 XVector_0.30.0
## [112] listenv_0.8.0 pbapply_1.4-3 ggplot.multistats_1.0.0
## [115] MASS_7.3-54 mgcv_1.8-36 tidyselect_1.1.1
## [118] phateR_1.0.7 stringi_1.7.3 highr_0.9
## [121] yaml_2.2.1 askpass_1.1 BiocSingular_1.6.0
## [124] locfit_1.5-9.4 ggrepel_0.9.1 grid_4.0.4
## [127] sass_0.4.0 tools_4.0.4 future.apply_1.8.1
## [130] rio_0.5.27 rstudioapi_0.13 bluster_1.0.0
## [133] foreign_0.8-81 gridExtra_2.3 smoother_1.1
## [136] farver_2.1.0 scatterplot3d_0.3-41 Rtsne_0.15
## [139] digest_0.6.27 BiocManager_1.30.16 shiny_1.6.0
## [142] Rcpp_1.0.7 car_3.0-11 broom_0.7.9
## [145] scuttle_1.0.4 BiocVersion_3.12.0 later_1.3.0
## [148] RcppAnnoy_0.0.19 httr_1.4.2 colorspace_2.0-2
## [151] XML_3.99-0.7 rvest_1.0.1 fs_1.5.0
## [154] tensor_1.5 ranger_0.13.1 splines_4.0.4
## [157] uwot_0.1.10 statmod_1.4.36 spatstat.utils_2.2-0
## [160] sp_1.4-5 plotly_4.9.4.1 xtable_1.8-4
## [163] jsonlite_1.7.2 destiny_3.4.0 R6_2.5.1
## [166] pillar_1.6.2 htmltools_0.5.1.1 mime_0.11
## [169] glue_1.4.2 fastmap_1.1.0 VIM_6.1.1
## [172] BiocParallel_1.24.1 BiocNeighbors_1.8.2 class_7.3-19
## [175] interactiveDisplayBase_1.28.0 codetools_0.2-18 utf8_1.2.2
## [178] lattice_0.20-44 bslib_0.2.5.1 spatstat.sparse_2.0-0
## [181] ResidualMatrix_1.0.0 curl_4.3.2 ggbeeswarm_0.6.0
## [184] leiden_0.3.9 openssl_1.4.4 zip_2.2.0
## [187] openxlsx_4.2.4 survival_3.2-13 rmarkdown_2.10
## [190] munsell_0.5.0 e1071_1.7-8 GenomeInfoDbData_1.2.4
## [193] haven_2.4.3 reshape2_1.4.4 gtable_0.3.0
## [196] spatstat.core_2.3-0
import session_info
session_info.show()## -----
## anndata 0.7.4
## numpy 1.19.5
## scanpy 1.6.0
## scipy 1.5.2
## session_info 1.0.0
## -----
## Python 3.7.9 (default, Aug 31 2020, 07:24:53) [Clang 10.0.0 ]
## Darwin-18.7.0-x86_64-i386-64bit
## -----
## Session information updated at 2021-09-01 12:13